package com.flx.sys.websocket;

import java.io.IOException;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

import javax.websocket.OnClose;
import javax.websocket.OnError;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;

import org.springframework.stereotype.Component;

@ServerEndpoint("/ws/chatRoom/{userName}") //WebSocket客户端建立连接的地址ws://127.0.0.1:8070/ws/chatRoom/
@Component
public class ChatRoomServerEndpoint {

	/**
	 * 存活的session集合（使用线程安全的map保存）
	 */
	private static Map<String, Session> livingSessions = new ConcurrentHashMap<>();

	/**
	 * 建立连接的回调方法
	 *
	 * @param session
	 *            与客户端的WebSocket连接会话
	 * @param userName
	 *            用户名，WebSocket支持路径参数
	 */
	@OnOpen
	public void onOpen(Session session, @PathParam("userName") String userName) {
		livingSessions.put(session.getId(), session);
		sendMessageToAll(userName + " 加入聊天室");
	}

	/**
	 * 收到客户端消息的回调方法
	 *
	 * @param message
	 *            客户端传过来的消息
	 * @param session
	 *            对应的session
	 */
	@OnMessage
	public void onMessage(String message, Session session, @PathParam("userName") String userName) {
		sendMessageToAll(userName + " : " + message);
	}

	/**
	 * 发生错误的回调方法
	 *
	 * @param session
	 * @param error
	 */
	@OnError
	public void onError(Session session, Throwable error) {
		System.out.println("发生错误");
		error.printStackTrace();
	}

	/**
	 * 关闭连接的回调方法
	 */
	@OnClose
	public void onClose(Session session, @PathParam("userName") String userName) {
		livingSessions.remove(session.getId());
		sendMessageToAll(userName + " 退出聊天室");
	}

	/**
	 * 单独发送消息
	 *
	 * @param session
	 * @param message
	 */
	public void sendMessage(Session session, String message) {
		try {
			session.getBasicRemote().sendText(message);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	/**
	 * 群发消息
	 *
	 * @param message
	 */
	public void sendMessageToAll(String message) {
		livingSessions.forEach((sessionId, session) -> {
			sendMessage(session, message);
		});
	}
}
